#ifndef CLIENTHANDLER_H
#define CLIENTHANDLER_H

#include <QThread>
#include <QtSql/QtSql>

#include <iostream>
#include <string>
#include <vector>

#include "../MySocket.h"
#include "../SocketException.h"
#include "../TransferedData.h"
#include "../database.h"


class ClientHandler : public QThread
{
private:
    MySocket m_sock;
    DataBase m_db;
    QString m_username;
    char *m_ip;
public:
    /**
     * @brief Constructeur pour une ipv4.
     */
    ClientHandler(MySocket &sock, DataBase &db, struct in_addr addr);

    /**
     * @brief Constructeur pour une ipv6.
     */
    ClientHandler(MySocket &sock, DataBase &db, struct in6_addr addr);

    ~ClientHandler();

    /**
     * @brief Récupère et écrit dans la base de donnée la liste des fichiers partagés du client.
     */
    void getFileList(int nbFiles);

    /**
     * @brief Envoi les noms de fichiers reçut par le serveur, des différent client, moins ceux du client demandant.
     */
    void sendFileList();

    /**
     * @brief Enregistre la description d'un fichier envoyé par le client dans la base de données.
     */
    void SaveFile(const char* fileName, const char* fileDescription, int fileSize);

    /**
     * @brief Vérifie le couple nom et password d'un utilisateur et renvoie vrai s'il est valide.
     * @param login Le nom et le password fournit par l'utilisateur
     */
    bool login(Identification logs);

    /**
     * @brief Crée un utilisateur s'il n'existe pas et renvoie vrai si l'utilisateur à été créé.
     * @param login Le nom et le password fournit par l'utilisateur
     */
    bool createUser(Identification logs);

    /**
     * @brief Récupère une connection pour le client et lui renvoie
     */
    void getConnection(char *name, char *author);

    /**
     * @brief Récupère une description pour le client et lui renvoie
     */
    void getDescription(char *name, char *author);

    /**
     * @brief Efface la connexion de la bd.
     */
    void logout();

    void search();

protected:
    void run();
};

#endif // CLIENTHANDLER_H
